//
//  ViewController.m
//  iOS9新特性
//
//  Created by 周成龙 on 16/7/25.
//  Copyright © 2016年 none. All rights reserved.
//

#import "ViewController.h"


#import "Person.h"
#import "IOS.h"
#import "JAVA.h"

@interface ViewController ()

/*
 nullable:表示可以为空
 // 方式一：
 @property (nonatomic, strong, nullable)NSString *name;
 // 方式二：
 @property (nonatomic, strong)NSString *_Nullable name;
 // 方式三：
 @property (nonatomic, strong)NSString *__nullable name;
 
 */


/*
    nonnull:表示不可以为空
    // 方式一：
    @property (nonatomic, strong, nonnull)NSString *name;
    // 方式二：
    @property (nonatomic, strong)NSString *_Nonnull name;
    // 方式三：
    @property (nonatomic, strong)NSString *__nonnull name;
 
*/

// nonnull，nullable，只能修饰对象，不能修饰基本数据类型

/*
 在 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 两个宏之间，定义所有的对象属性都是 nonnull
 
 NS_ASSUME_NONNULL_BEGIN
 @property(nonatomic) NSString *name;
 NS_ASSUME_NONNULL_END
 */

/*
 null_resettable:
 get方法不能为空
 set方法可以为空
 必须处理 set 或 get 方法，处理值为空的情况
 */


/*
 _Null_unspecified: 不确定是否为空
 
 */

//@property (nonatomic, strong, null_resettable)NSString *name;

//- (nonnull NSString *)test;


/**
 泛型：限制类型
 泛型使用场景
 1. 在集合类（数组，字典，NSSet）中使用泛型比较常见
 2. 在申明一个类，类里面的属性类型不确定，这时候我们才使用泛型
 
 泛型书写规范
 类型后面定义泛型  NSMutableArray<UITouch *> *datas
 泛型修饰
 只能修饰方法的调用
 
 
 泛型好处：
 1. 提高书写规范，减少程序员之间的交流
 2. 通过集合取出来的对象，直接当做泛型对象使用，直接调用点语法
 
 
 __covariant(协变)：用于数据强转类型，可以向上强转，子类强转成父类
 逆变：用于泛型强转类型，向下强转，父类强转成子类
 */


/**
 __kindof: 表示语序当前类或子类
 书写格式：
 __kindof放在类型前面
 
 */

@property (nonatomic, strong) NSMutableArray<NSString *> *datas;



@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.datas addObject:@1];
}

//- (NSString *)name
//{
//    if (nil == _name) {
//        _name = @"123";
//    }
//    return _name;
//}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UITableView
    
    
    
    Person<IOS *> *p = [[Person alloc] init];
    p.laguge = nil;
    
    
}

@end
